#ifndef MAPMANAGER_H
#define MAPMANAGER_H

#include "spot.h"
#include "findpaththread.h"
#include <QSize>
#include <QString>
#include <QHash>
#include <QSharedPointer>
#include <QPointF>
#include <QPainter>

class MapManager
{
public:
    static MapManager& instance(){
        if (manager == nullptr){
            manager = new MapManager;
        }
        return *manager;
    }
    void paint(QPainter& painter);
    void paintStations(QPainter& painter);
    void paintEdges(QPainter& painter);
    void paintLine1(QPainter& painter);
    void paintLine2(QPainter& painter);
    void initMap(QWidget* scene);
    void getSearchData(QStringList& searchData);

    QSharedPointer<Node> findNodeAt(const QPointF& worldPos, double radius = 20.0);

    void connect(const QString& src, const QString& dst, const QString& line);
    void disconnect(const QString& src, const QString& dst);
    void findpath(const QString& src, const QString& dst);
    void findpathbyname(const QString& src, const QString& src_line, const QString& dst, const QString& dst_line);
    void selectLine(int tgt);

    QSize backgroundSize() const {
//        return _image_svg->size();
        return {9000, 3000};
    }

    void reload();
    void storage();

    void erase(const QString& node_id, const QString& line);

    QStringList getPath(int path);
private:
    MapManager();
    MapManager(const MapManager&) = delete;

    void load();
    // 从资源文件加载信息
    void loadStations(const QString& path);
    void loadEdges(const QString& path);
    void loadClosed(const QString& path);

    void loadSVG();


private:
    QImage* _image_svg; // 背景路线图

    QHash<QString, QSharedPointer<Node>> _id_nodes; // id找node
    QHash<QString, QVector<QSharedPointer<Node>>> _name_nodes; // name找node(不唯一,不能一一对应

    QHash<QString, QList<Edge>> _graph; // 邻接表, k是节点id, v是所能抵达的节点id链表,链表的值是所需运行时间
    QHash<QString, QHash<QString, QStringList>> _lines; // 路线 <--> 节点 - 邻居

    QHash<QString, QHash<QString, QStringList>> _erase_node_line; // 被删除的 节点 对应的 线路 对应的 相邻节点

    bool ready = true;

    bool _finded;
    QVector<QString> _path;
public:FindpathThread _findpathThread;
private:
    bool _finded2;
    int _transfer;
    QVector<QString> _path2;
    FindpathThread _findpathThread2;

    int _selectline = 1;
private:
    static MapManager* manager;
};

#endif // MAPMANAGER_H
